
// 1. 导入依赖
const WebSocket = require('ws');

// 2. 创建WebSocket服务器
const wss = new WebSocket.Server({
  port: 8010,
  clientTracking: true // 跟踪客户端连接
});

console.log('信令服务器运行在 ws://172.20.10.2:8010');

// 3. 房间管理容器
const rooms = new Map(); // {房间ID => Set<客户端连接>}

// 4. 处理客户端连接
wss.on('connection', (ws) => {
  console.log('新客户端连接');
  let currentRoom = null; 

  // 5. 消息处理
  ws.on('message', (rawData) => {
    try {
      const data = JSON.parse(rawData);
      console.log('收到消息:', data.type);

      switch (data.type) {
        // 处理加入房间请求
        case 'join':
          handleJoinRoom(ws, data.roomId);
          break;

        // 转发媒体协商信息
        case 'offer':
        case 'answer':
        case 'candidate':
          forwardMessage(data);
          break;
      }
    } catch (err) {
      console.error('消息处理错误:', err);
    }
  });

  // 6. 连接关闭处理
  ws.on('close', () => {
    console.log('客户端断开连接');
    cleanupRoom();
  });

  // 7. 加入房间处理函数
  function handleJoinRoom(ws, roomId) {
    currentRoom = roomId;
    
    // 创建房间（如果不存在）
    if (!rooms.has(roomId)) {
      rooms.set(roomId, new Set());
    }
    
    // 将当前连接加入房间
    const room = rooms.get(roomId);
    room.add(ws);
    
    console.log(`客户端加入房间 ${roomId}, 当前人数: ${room.size}`);
  }

  // 8. 消息转发函数
  function forwardMessage(data) {
    const room = rooms.get(currentRoom);
    if (!room) return;

    room.forEach(client => {
      // 转发给房间内其他客户端
      if (client !== ws && client.readyState === WebSocket.OPEN) {
        client.send(JSON.stringify(data));
      }
    });
  }

  // 9. 清理房间函数
  function cleanupRoom() {
    if (!currentRoom || !rooms.has(currentRoom)) return;
    
    const room = rooms.get(currentRoom);
    room.delete(ws);
    
    // 空房间自动销毁
    if (room.size === 0) {
      rooms.delete(currentRoom);
      console.log(`房间 ${currentRoom} 已销毁`);
    }
  }
});
